/**
 * Copyright (c) Huawei Technologies Co., Ltd. 1987-2021. All rights reserved.
*/

package com.gitee.fufu669.utils;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;

// 注解
@SuppressWarnings({ "rawtypes", "unchecked" })
/** @author wangfupeng */
/**
 * TODO
*/
public class CacheMapUtil {

    /**
     * TODO
    */
    public static final Logger logger = LoggerFactory.getLogger(CacheMapUtil.class);

    /**
     * TODO
    */
    public static String startsWithString = "\"";
    
    /**
     * TODO
    */
    public static String endsWithString = "\"";

    /**
     * TODO
    */
    public static <T> Map objToStringMap(T obj) {
        // 判断是否是空
        if (obj == null) {
            // 返回
            return null;
        }

        // 创建
        Map<String, String> map = new HashMap<>(16);
        // 赋值
        BeanInfo beanInfo = null;
        // 判断
        if (obj.getClass().equals(HashMap.class)) {
            // 返回
            return (Map) obj;
        }
        // 尝试下面的代码
        try {
            // TODO
            beanInfo = Introspector.getBeanInfo(obj.getClass());
            // TODO
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            // 遍历
            for (PropertyDescriptor property : propertyDescriptors) {
                // 字符串赋值
                String key = property.getName();
                // 判断
                if (key.compareToIgnoreCase("class") == 0) {
                    // 继续
                    continue;
                }
                // TODO
                Method getter = property.getReadMethod();
                // TODO
                Object value = getter != null ? getter.invoke(obj) : null;
                // 塞入
                map.put(key, value+"");
            }
        // 捕捉异常
        } catch (Exception e) {
            logger.info("CacheMapUtil.objToMap error... ", e);
        }

        // 返回
        return map;
    }
    /**
     * TODO
    */
    public static <T> Map objToMap(T obj) {
        // 判断是否是空
        if (obj == null) {
            // 返回
            return null;
        }

        // 创建
        Map<String, Object> map = new HashMap<>(16);
        // 赋值
        BeanInfo beanInfo = null;
        // 判断
        if (obj.getClass().equals(HashMap.class)) {
            // 返回
            return (Map) obj;
        }
        // 尝试下面的代码
        try {
            // TODO
            beanInfo = Introspector.getBeanInfo(obj.getClass());
            // TODO
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            // 遍历
            for (PropertyDescriptor property : propertyDescriptors) {
                // 字符串赋值
                String key = property.getName();
                // 判断
                if (key.compareToIgnoreCase("class") == 0) {
                    // 继续
                    continue;
                }
                // TODO
                Method getter = property.getReadMethod();
                // TODO
                Object value = getter != null ? getter.invoke(obj) : null;
                // 塞入
                map.put(key, value);
            }
        // 捕捉异常
        } catch (Exception e) {
            logger.info("CacheMapUtil.objToMap error... ", e);
        }

        // 返回
        return map;
    }

    /**
     * TODO
    */
    public static <T> MultiValueMap<String, Object> objToMultiValueMap(T obj) {
        // 判断是否是空
        if (obj == null) {
            // 返回
            return null;
        }

        // 创建
        MultiValueMap<String, Object> map = new LinkedMultiValueMap();
        // 赋值
        BeanInfo beanInfo = null;
        // 尝试下面的代码
        try {
            // TODO
            beanInfo = Introspector.getBeanInfo(obj.getClass());
            // TODO
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            // 遍历
            for (PropertyDescriptor property : propertyDescriptors) {
                // 字符串赋值
                String key = property.getName();
                // 判断
                if (key.compareToIgnoreCase("class") == 0) {
                    // 继续
                    continue;
                }
                // TODO
                Method getter = property.getReadMethod();
                // TODO
                Object value = getter != null ? getter.invoke(obj) : null;
                // 增加
                map.add(key, value);
            }
        // 捕捉异常
        } catch (Exception e) {
            logger.info("CacheMapUtil.MultiValueMap error... ", e);
        }

        // 返回
        return map;
    }

    /**
     * TODO
    */
    public static <T> T mapToObject(Map map, Class<? extends T> beanClass) {
        // 判断
        if (null == map || map.size() == 0) {return null;}
        // 尝试下面的代码
        try {
            // TODO
            T obj = (T) beanClass.newInstance();
            // TODO
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            // TODO
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            // 遍历
            for (PropertyDescriptor property : propertyDescriptors) {
                // TODO
                Method setter = property.getWriteMethod();
                // 判断是否非空
                if (setter != null) {
                    // 拿出
                    Object propertyValue = map.get(property.getName());
                    // 判断是否非空
                    if (propertyValue != null) {
                        // TODO
                        setter.invoke(obj, praser(setter, propertyValue));
                    }
                }
            }
            // 返回
            return obj;
        // 捕捉异常
        } catch (Exception e) {
            logger.info("CacheMapUtil.objToMap error... ", e);
        }

        // 返回
        return null;
    }

    // TODO
    private static Object praser(Method setter, Object value) {
        // TODO
        Class<?> cls = setter.getParameterTypes()[0];
        // 判断
        if (value instanceof String && cls != String.class) {
            // 判断
            if (StringUtils.isEmpty(value.toString())) {
                // 返回
                return null;
            }
        }

        // 判断
        if (cls.equals(Date.class)) {
            // 返回
            return new Date(Long.parseLong(value.toString()));
        // 判断
        } else if (cls == byte.class || cls == Byte.class) {
            // 返回
            return Byte.parseByte(value.toString());
        // 判断
        } else if (cls == int.class || cls == Integer.class) {
            // 返回
            return Integer.parseInt(value.toString());
        // 判断
        } else if (cls == long.class || cls == Long.class) {
            // 返回
            return Long.parseLong(value.toString());
        // 判断
        } else if (cls == boolean.class || cls == Boolean.class) {
            // 返回
            return Boolean.parseBoolean(value.toString());
        // 判断
        } else if (cls == String.class) {
            // 字符串赋值
            String stringValue = value.toString();
            // 判断
            if (stringValue.startsWith(startsWithString) && stringValue.endsWith(endsWithString)) {
                // 返回
                return stringValue.substring(1, stringValue.length() - 1);
            }
        }
        // 返回
        return value;
    }
}
